﻿//using System;
//using System.IdentityModel.Tokens.Jwt;
//using System.Security.Claims;
//using System.Text;
//using Microsoft.IdentityModel.Tokens;
//using Microsoft.Extensions._configuration;
//using System.Composition;
//using Microsoft.AspNetCore.Mvc;
//namespace Server.API
//{
//    // Token服务类：负责生成访问令牌（Access Token）和刷新令牌（Refresh Token），并提供刷新逻辑
//    public class TokenService
//    {

//        private readonly IConfiguration _configuration;

//        // 构造函数：通过依赖注入获取配置对象，用于读取JWT相关配置
//        public TokenService(IConfiguration _configuration)
//        {

//            this._configuration = _configuration;
//        }

//        // 生成 JWT Access Token 和 Refresh Token
//        public (string AccessToken, string RefreshToken) GenerateTokens(string userId, string userName)
//        {
//            var tokenHandler = new JwtSecurityTokenHandler();
//            var key = Encoding.ASCII.GetBytes(_configuration["JwtSettings:Secret"]);

//            // 生成 Access Token
//            var accessTokenDescriptor = new SecurityTokenDescriptor
//            {
//                Subject = new ClaimsIdentity(new Claim[]
//                {
//        new Claim(ClaimTypes.NameIdentifier, userId),
//        new Claim(ClaimTypes.Name, userName)
//                }),
//                Issuer = _configuration["JwtSettings:Issuer"],
//                Audience = _configuration["JwtSettings:Audience"],
//                Expires = DateTime.UtcNow.AddMinutes(double.Parse(_configuration["JwtSettings:ExpireMinutes"])),
//                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
//            };
//            var accessToken = tokenHandler.CreateToken(accessTokenDescriptor);

//            // 生成 Refresh Token
//            var refreshTokenDescriptor = new SecurityTokenDescriptor
//            {
//                Subject = new ClaimsIdentity(new Claim[]
//                {
//        new Claim(ClaimTypes.NameIdentifier, userId)
//                }),
//                Issuer = _configuration["JwtSettings:Issuer"],
//                Audience = _configuration["JwtSettings:Audience"],
//                Expires = DateTime.UtcNow.AddDays(7), // Refresh Token 有效期 7 天
//                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
//            };
//            var refreshToken = tokenHandler.CreateToken(refreshTokenDescriptor);

//            return (tokenHandler.WriteToken(accessToken), tokenHandler.WriteToken(refreshToken));
//        }

//        // 根据旧 JWT 令牌换取新 JWT 令牌
//        public string ExchangeJwtToken(string oldToken)
//        {
//            if (!ValidateJwtToken(oldToken))
//            {
//                thrownew InvalidOperationException("Invalid or expired token");
//            }

//            var principal = ParseJwtToken(oldToken);
//            var userId = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
//            var userName = principal.FindFirst(ClaimTypes.Name)?.Value;

//            if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(userName))
//            {
//                thrownew InvalidOperationException("Invalid token claims");
//            }

//            return GenerateJwtToken(userId, userName);
//        }

//        // 刷新 Access Token
//        [HttpPost("refresh")]
//        public IActionResult RefreshToken([FromBody] RefreshTokenRequest request)
//        {
//            try
//            {
//                var validatetoken = _tokenService.ValidateJwtToken(request.RefreshToken);
//                if (validatetoken)
//                {
//                    return Ok(_tokenService.ExchangeJwtToken(request.RefreshToken));
//                }
//                return Unauthorized("Invalid refresh token");
//            }
//            catch (Exception ex)
//            {
//                return Unauthorized("Invalid refresh token");
//            }
//        }





















































//        // 生成 JWT Access Token 和 Refresh Token
//        public (string AccessToken, string RefreshToken) GenerateTokens(string UserName, string RealName, TimeSpan expiry)
//        {
//            var tokenHandler = new JwtSecurityTokenHandler();
//            var key = Encoding.ASCII.GetBytes(_configuration["JwtSettings:secretByte"]);

//            // 生成 Access Token
//            var accessTokenDescriptor = new SecurityTokenDescriptor
//            {
//                Subject = new ClaimsIdentity(new Claim[]
//                {
//        new Claim("UserName",UserName),
//        new Claim("RealName", RealName)
//                }),
//                Issuer = _configuration["JwtSettings:Issuer"],
//                Audience = _configuration["JwtSettings:Audience"],
//                Expires = DateTime.UtcNow.Add(expiry),
//                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
//            };
//            var accessToken = tokenHandler.CreateToken(accessTokenDescriptor);

//            // 生成 Refresh Token
//            var refreshTokenDescriptor = new SecurityTokenDescriptor
//            {
//                Subject = new ClaimsIdentity(new Claim[]
//                {
//        new Claim("UserName",UserName),
//        new Claim("RealName", RealName)
//                }),
//                Issuer = _configuration["JwtSettings:Issuer"],
//                Audience = _configuration["JwtSettings:Audience"],
//                Expires = DateTime.UtcNow.Add(expiry), // Refresh Token 有效期 7 天
//                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
//            };
//            var refreshToken = tokenHandler.CreateToken(refreshTokenDescriptor);

//            return (tokenHandler.WriteToken(accessToken), tokenHandler.WriteToken(refreshToken));
//        }







//        // 方法：验证一个JWT令牌是否有效（签名、过期时间、签发者、接收者等）
//        // 参数：token - 待验证的JWT字符串
//        // 返回值：true表示有效，false表示无效或已过期
//        public bool ValidateJwtToken(string token)
//        {
//            // 如果令牌为空或仅包含空白字符，直接返回false
//            if (string.IsNullOrWhiteSpace(token))
//                return false;
//            var tokenHandler = new JwtSecurityTokenHandler();
//            var key = Encoding.ASCII.GetBytes(_configuration["JwtSettings:secretByte"]);
//            try
//            {
//                var i = _configuration["JwtSettings:Issuer"];
//                var j = _configuration["JwtSettings:Audience"];
//                // 使用TokenValidationParameters验证令牌
//                tokenHandler.ValidateToken(token, new TokenValidationParameters
//                {
//                    ValidateIssuer = true,           // 验证签发者
//                    ValidateAudience = true,         // 验证接收者
//                    ValidateLifetime = true,         // 验证是否过期
//                    ValidateIssuerSigningKey = true, // 验证签名密钥
//                    ValidIssuer = _configuration["JwtSettings:Issuer"],
//                    ValidAudience = _configuration["JwtSettings:Audience"],
//                    IssuerSigningKey = new SymmetricSecurityKey(key)
//                }, out _); // out参数可获取解析后的令牌对象，此处不需要故忽略

//                // 验证通过，返回true
//                return true;
//            }
//            catch
//            {
//                // 任何验证失败（如签名错误、过期、Issuer不匹配等）均返回false
//                return false;
//            }
//        }


//        // 方法：使用旧令牌（通常是Refresh Token）换取新的Access Token
//        // 参数：oldToken - 旧的JWT令牌字符串
//        // 返回值：新的Access Token字符串
//        public string ExchangeJwtToken(string oldToken, string UserName, string RealName)
//        {
//            // 首先验证旧令牌是否有效
//            if (!ValidateJwtToken(oldToken))
//            {
//                throw new InvalidOperationException("令牌无效或过期");
//            }
//            // 检查是否成功提取到用户ID和用户名
//            if (string.IsNullOrEmpty(UserName) || string.IsNullOrEmpty(RealName))
//            {
//                throw new InvalidOperationException("令牌声明无效");
//            }
//            // 生成新的Access Token（Refresh Token本身不更新）
//            return CreateTokenString(UserName, RealName);
//        }
//        /// <summary>
//        /// 【简化版】仅生成 Access Token（供 ExchangeJwtToken 调用）
//        /// </summary>
//        private string CreateTokenString(string userId, string userName)
//        {
//            var tokenHandler = new JwtSecurityTokenHandler();
//            var key = Encoding.ASCII.GetBytes(_configuration["JwtSettings:Secret"]);

//            var tokenDescriptor = new SecurityTokenDescriptor
//            {
//                Subject = new ClaimsIdentity(new Claim[]
//                {
//                new Claim(ClaimTypes.NameIdentifier, userId),
//                new Claim(ClaimTypes.Name, userName)
//                }),
//                Issuer = _configuration["JwtSettings:Issuer"],
//                Audience = _configuration["JwtSettings:Audience"],
//                Expires = DateTime.UtcNow.AddMinutes(double.Parse(_configuration["JwtSettings:ExpireMinutes"])),
//                SigningCredentials = new SigningCredentials(
//                    new SymmetricSecurityKey(key),
//                    SecurityAlgorithms.HmacSha256Signature)
//            };

//            var token = tokenHandler.CreateToken(tokenDescriptor);
//            return tokenHandler.WriteToken(token);
//        }




//    }
//}
